/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb.common;

import entity.DettaglioPrezzo;
import entity.Marchio;
import entity.Prodotto;
import facade.ProdottoFacade;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.ParameterExpression;

/**
 *
 * @author Valerio
 */
@Stateless
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public class ProdottoManager implements ProdottoManagerLocal {

    @EJB
    private ProdottoFacade prodottoFacade;
    @PersistenceContext(unitName = "E-Market-ejbPU")
    private EntityManager em;

    @Override
    public void creaProdotto(Prodotto p) {

        Query q = em.createNamedQuery("prodotto.cercaPerNome");
        q.setParameter(1, p.getNome());

        if (!q.getResultList().isEmpty()) {

            return;
        }
        prodottoFacade.create(p);
    }// creaProdotto

    @Override
    public void modificaProdotto(Prodotto p) {

        Query q = em.createNamedQuery("prodotto.cercaPerNome");
        q.setParameter(1, p.getNome());

        if (q.getResultList().isEmpty()) {
            return;
        }

        prodottoFacade.edit(p);
    }// modificaProdotto

    @Override
    public void rimuoviProdotto(Prodotto p) {

        Query q = em.createNamedQuery("prodotto.cercaPerNome");
        q.setParameter(1, p.getNome());

        if (q.getResultList().isEmpty()) {

            return;
        }
        prodottoFacade.remove(p);
    }// rimuoviProdotto

    public void persist(Object object) {
        em.persist(object);
    }

    @Override
    public List<Prodotto> cercaPerNome(String nome) {

        List<Prodotto> prod;
        Query q = em.createNamedQuery("prodotto.cercaPerNome");
        q.setParameter(1, nome);
        prod = q.getResultList();
        return prod;

    }// cercaPerNome

    @Override
    public Prodotto cercaPerId(Long id) {

        Prodotto prodotto = prodottoFacade.find(id);
        return prodotto;

    }// cercaPerId

    @Override
    public void creaProdotti(List<Prodotto> listP) {

        if (listP.isEmpty()) {
            return;
        }

        for (int i = 0; i <= listP.size() - 1; i++) {

            prodottoFacade.create(listP.get(i));
        }
    }// creaProdotti

    @Override
    public List<Prodotto> cercaTutto() {
        return prodottoFacade.findAll();
    }

    @Override
    public List<Prodotto> cercaDaMarchio(Marchio m) {

        List<Prodotto> prod;
        Query q = em.createNamedQuery("prodotto.cercaDaMarchio");
        q.setParameter(1, m.getId());
        prod = q.getResultList();
        return prod;
    }

    @Override
    public List<Prodotto> getProdottiFromRepartoConFornitura(Long repartoID, Long negozioID) {
        Query q = em.createNamedQuery("prodotto.prodottoDaRepartoFornituraMaggioreZero");
        q.setParameter(1, repartoID);
        q.setParameter(2, negozioID);
        return q.getResultList();
    }

    @Override
    public DettaglioPrezzo getPrezzoProdotto(Long idNegozio, Long idProdotto) {
        Query q = em.createNamedQuery("prodotto.prezzo");
        q.setParameter(1, idProdotto);
        q.setParameter(2, idNegozio);
        return (DettaglioPrezzo) q.getSingleResult();
    }

    @Override
    public boolean prodottoFornito(Long idProdotto, Long idNegozio) {
        Query q = em.createNamedQuery("prodotto.prodottoFornito");
        q.setParameter(1, idProdotto);
        q.setParameter(2, idNegozio);
        if (q.getResultList().isEmpty()) {
            return false;
        }
        return true;
    }

    @Override
    public List<Prodotto> prodottiDaUnSet(java.util.Set<Long> codiceBarre) {
        if(codiceBarre==null){
            return null;
        }
        if(codiceBarre.isEmpty()){
            return null;
        }
        Query q = em.createNamedQuery("prodotto.prodottiDaUnSet");
        q.setParameter("lista", codiceBarre);
        return q.getResultList();
    }
}